package cn.mesmile.workflow.process.service;

import cn.mesmile.workflow.commom.Query;
import cn.mesmile.workflow.commom.R;
import cn.mesmile.workflow.process.bo.OperationTaskBO;
import cn.mesmile.workflow.process.dto.WorkFlowNodeDTO;
import cn.mesmile.workflow.process.qo.WorkFlowQO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;

import java.util.List;
import java.util.Map;

/**
 * @author zb
 * @Description
 */
public interface WorkFlowService {

    /**
     * 部署流程
     * @return 部署结果
     */
    Deployment deploy();

    /**
     *  查询所有版本流程定义列表
     * @param query  查询分页参数
     * @param workFlowQO 查询条件
     * @return 查询结果
     */
    IPage<ProcessDefinition> listProcessDefinition(Query query, WorkFlowQO workFlowQO);

    /**
     * 根据流程定义id发起流程实例
     * @param processDefId 流程定义id
     * @param variables  表单值
     * @return 流程实例
     */
    ProcessInstance startProcessInstanceByDefId(String processDefId, Map<String,Object> variables);

    /**
     * 查询我待办任务列表
     * @param query  查询分页参数
     * @param workFlowQO 查询条件
     * @return 查询结果
     */
    IPage<Task> listTodoTask(Query query, WorkFlowQO workFlowQO);

    /**
     * 查询我待签任务列表
     * @param query 查询分页参数
     * @param workFlowQO 查询条件
     * @return 查询结果
     */
    IPage<Task> listClaimTask(Query query, WorkFlowQO workFlowQO);

    /**
     * 查询我已办任务列表
     * @param query  查询分页参数
     * @param workFlowQO 查询条件
     * @return 查询结果
     */
    IPage<HistoricProcessInstance> listDoneProcess(Query query, WorkFlowQO workFlowQO);

    /**
     *  查询我发起的流程实例列表
     * @param query  查询分页参数
     * @param workFlowQO 查询条件
     * @return 查询结果
     */
    IPage<HistoricProcessInstance> listSendProcess(Query query, WorkFlowQO workFlowQO);

    /**
     *  完成任务 通过或者驳回
     * @param operationTaskBO 操作任务
     * @return
     */
    R completeTask(OperationTaskBO operationTaskBO);

    /**
     *  催办任务，发送通知消息
     * @param operationTaskBO
     */
    void urgeTask(OperationTaskBO operationTaskBO);

    /**
     *  转交任务
     * @param operationTaskBO 转办参数
     */
    void transferTask(OperationTaskBO operationTaskBO);

    /**
     *  委托任务【委托任务，当被委托人完成任务后，会重新回到这个节点】
     * @param operationTaskBO
     */
    void delegateTask(OperationTaskBO operationTaskBO);

    /**
     *  终止流程，跳转任务到结束点
     * @param operationTaskBO
     */
    void terminationTask(OperationTaskBO operationTaskBO);

    /**
     *  加签任务
     * @param operationTaskBO
     */
    void addMultiInstance(OperationTaskBO operationTaskBO);

    /**
     *  减签任务
     * @param operationTaskBO
     */
    void deleteMultiInstance(OperationTaskBO operationTaskBO);

    /**
     * 回退任务到指定节点
     * @param operationTaskBO
     */
    void rollbackTask(OperationTaskBO operationTaskBO);

    /**
     *  签收任务
     * @param taskId
     */
    void claimTask(String taskId);

    /**
     * 获取可回退的节点列表
     * @param operationTaskBO 传入当前任务id
     * @return 主流程中可回退的节点列表
     */
    List<WorkFlowNodeDTO> getBackNodeList(OperationTaskBO operationTaskBO);

    /**
     *  获取上一步可回退的节点
     * @param operationTaskBO 当前任务id
     * @return
     */
    WorkFlowNodeDTO getPreBackNode(OperationTaskBO operationTaskBO);
}
